package main

// nil channel 的特性：对 nil channel 进行读写会发生堵塞
// 示例1：预期输出 5 和 7 后程序退出，但是实际运行结果是，输出5，然后输出了许多 0，，最后才输出 7 然后程序退出

import (
	"log"
	"time"
)

func main() {
	// var c chan int

	// Go 1.24+, fatal error: all goroutines are asleep - deadlock!
	// c <- 5
	// <-c

	ch1, ch2 := make(chan int), make(chan int)

	go func() {
		time.Sleep(5 * time.Second)
		ch1 <- 5
		close(ch1)
	}()

	go func() {
		time.Sleep(7 * time.Second)
		ch2 <- 7
		close(ch2)
	}()

	var ok1, ok2 bool

	for {
		select {
		case v1 := <-ch1:
			// 在输出 5 之后， ch1 被关闭，由于从关闭的 channel 接收数据用于不会被阻塞，
			// 因此该分支后续仍然被选中执行，但此时 v1 是 0
			ok1 = true
			log.Println(v1)
		case v2 := <-ch2:
			ok2 = true
			log.Println(v2)
		}

		if ok1 && ok2 {
			break
		}
	}

	// Output: 和预期不符

	log.Println("program end")

}
